#!/usr/bin/env python
# -*- coding: utf-8 -*-

'''可变的set'''
s1 = set([123,"google","face","book","facebook","book"])
print s1 # set中不会出现重复的元素,因此打印的结果中只会出现一个“book”

'''add和update'''
s1.add('with')
print s1
s1.add('[1, 2, 3]') # 如果没有使用单引号括住list的话,会报错,因为list是不可哈希的
print s1

s2 = set(['I', 'like', 'study', 'Python'])
s1.update(s2)
print s1

'''pop/remove/discard/clear用法'''
print s1.pop() # 随机选一个删除,并返回被删的值,当set为空时会报错
print s1

s1.remove('face') # remove方法是没有返回值的操作办法,当set中没有需要删除的值将会报错
print s1

s1.discard('book') # discard方法跟remove都是删除指定的值,但是discard的优势在于:如果set存在需要被删除的元素,这个元素就会被删除,如果不存在则不做任何操作,也不会报错!
print s1

s1.clear() # 将整个set的值清空,但是不会删除这个set,只是这个set成了一个空set
print s1

'''不可变的set,不能新增任何元素,也不能删除任何元素'''
s3 = frozenset('Iwanttokissyou')
print s3

'''集合的计算'''
'''查看集合中是否存在某个元素'''
if 'with' in s1:
    print 's1 had it'
else:
    s1.add('with')
    print s1

'''判断两个集合是否完全一样'''
if s1 == s2:
    print unicode('s1和s2完全一样', "utf-8")
else:
    print unicode('s1和s2不完全一样', "utf-8")

'''子集与超集'''
setA = set(['a', 'b', 'c', 'd', 'e', 'f'])
setB = set(['a', 'b', 'c', 'd', 'e', 'f', 'g'])
if setA.issubset(setB):
    print unicode('setA是setB的子集', "utf-8")
elif setA.issuperset(setB):
    print unicode('setA是setB的超集', "utf-8")

'''并集与交集'''
setC = set([1, 2, 3, 4, 5])
setD = set([5, 6, 7, 8, 9])
'''第一种方法:setC.union(setD)和setC.intersection(setD)'''
print "{tips}:{setBing}\n{tips2}:{setJiao}".format(tips = unicode('第一种方法\nsetC和setD的并集', "utf-8").encode("utf-8"), setBing = setC.union(setD), tips2 = unicode('setC和setD的交集', "utf-8").encode("utf-8"), setJiao = setC.intersection(setD))

'''第二种方法: setC | setD和setC & setD'''
print "{tips}:{setBing}\n{tips2}:{setJiao}".format(tips = unicode('第二种方法\nsetC和setD的并集', "utf-8").encode("utf-8"), setBing = setC | setD, tips2 = unicode('setC和setD的交集', "utf-8").encode("utf-8"), setJiao = setC & setD)

